package com.syedu.day04;

import java.util.Random;

/**
 * description：JVM内存结构
 *
 * 1.栈区stack[先进后出,类似于子弹弹夹],存放变量名,以及基本类型的值和对象类型的内存地址
 * 2.堆区heap[先进先出,类似于海洋],存放对象类型本身(new出来的对象)
 * 3.方法区method,存放字节码文件,静态成员...
 *
 * 总结:
 * 1.new关键字表示在内存堆空间开辟一块空间来保存创建的对象本身,而这个空间对应一个十六进制的内存地址,
 * 该地址存储在栈区,这个地址就指向了这个对象的本身
 * 2.对象如果没有被任何引用所执行,就是垃圾对象,会被JVM的gc回收
 *
 * 3.气球理论:
 *   一个对象在某一个时刻,可以被多个引用所指向
 *   一个引用在某一个时刻,只能指向一个对象
 *
 * @author Administrator
 * @date 2022/3/10 14:21
 */
public class Jvm {
    public static void main(String[] args) {
        //在栈区创建一个i变量并且保存的值为3
        int i = 3;

        //在堆中开辟一块空间来保存创建的Random对象,并且把这个空间对应的内存地址保存在栈中(random1)
        Random random1 = new Random();

        //在堆中开辟再一块空间来保存创建的另一个Random对象,并且把这个空间对应的内存地址保存在栈中(random2)
        Random random2 = new Random();

        /**
         * random2的内存地址覆盖了random1的内存地址,即random1和random2中保存的是原来random2的内存地址(相同)
         * 目前的状况是,栈中有两个变量,分别是random1和random2,但是它们中保存的内存地址是一样的(原来random2的内存地址)
         * 堆中目前也是仍然有两个对象本体,但是栈中的两个变量同时指向了堆中第二次创建的Random对象本体,而第一次创建的Random对象没有任何指针指向
         * 此时,第一次创建的Random对象就变成了垃圾对象(没有任何引用所指向的对象,无法被访问的),垃圾对象在JVM中会被GC进行自动回收
         *
         * GC,Java垃圾回收器,它是Java进行自动资源回收的机制,它的运行有自己的算法,也就是说,垃圾的产生和垃圾的回收不是同步的,GC会根据JVM
         * 当前的情况来动态调节垃圾回收的实际,我们程序员可以用某些手段来催促垃圾回收,但是不能起到决定性作用!
         * System.gc();
         * Runtime.getRuntime().gc();
         */
        random1 = random2;

       /* Random random3 = new Random();
        random3 = null;*/
    }
}